import svgCaptcha from 'svg-captcha';
import crypto from 'crypto';

// 存储验证码的内存存储
const captchaStore = new Map();

class CaptchaService {
  // 生成验证码
  static generateCaptcha() {
    // 生成随机ID
    const captchaId = crypto.randomUUID();
    
    // 生成验证码
    const captcha = svgCaptcha.create({
      size: 4, // 验证码长度
      noise: 2, // 干扰线条数
      ignoreChars: '0o1il', // 忽略容易混淆的字符
      height: 60, // 验证码高度
      width: 160, // 验证码宽度
      fontSize: 40, // 字体大小
      color: true // 彩色验证码
    });
    
    // 存储验证码（10分钟过期）
    captchaStore.set(captchaId, {
      text: captcha.text.toLowerCase(),
      expiresAt: Date.now() + 10 * 60 * 1000 // 10分钟后过期
    });
    
    return {
      captchaId,
      svg: captcha.data
    };
  }
  
  // 验证验证码
  static verifyCaptcha(captchaId, userInput) {
    // 检查验证码是否存在
    const storedCaptcha = captchaStore.get(captchaId);
    if (!storedCaptcha) {
      return false;
    }
    
    // 检查验证码是否过期
    if (Date.now() > storedCaptcha.expiresAt) {
      captchaStore.delete(captchaId);
      return false;
    }
    
    // 验证验证码
    const isValid = storedCaptcha.text === userInput.toLowerCase();
    
    // 验证码一次性使用后删除
    if (isValid) {
      captchaStore.delete(captchaId);
    }
    
    return isValid;
  }
  
  // 清理过期的验证码
  static cleanupExpiredCaptchas() {
    const now = Date.now();
    for (const [captchaId, storedCaptcha] of captchaStore.entries()) {
      if (now > storedCaptcha.expiresAt) {
        captchaStore.delete(captchaId);
      }
    }
  }
}

// 每5分钟清理一次过期的验证码
setInterval(CaptchaService.cleanupExpiredCaptchas, 5 * 60 * 1000);

export default CaptchaService;